import axios from 'axios'
import config from './config'
import router from '../router'



export default function request(options) {
    return new Promise((resolve, reject) => {
        const instance = axios.create({
            ...config
        })

        // request请求拦截器
        instance.interceptors.request.use(
            (config) => {
                console.log('config', config);

                // 判断是否有登录态的逻辑
                let token = localStorage.getItem('pm_token')
                if (token) {
                    config.headers.token = token
                } else {
                    router.push('/login')
                }

                return config
            },
            (error) => {
                // 请求发生错误时
                console.log('request:', error)
                // 判断请求超时
                if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
                    ElMessage({
                        message: '请求超时',
                        type: 'error',
                        showClose: true
                    })
                }

                return Promise.reject(error)
            }
        )

        // response 响应拦截器
        instance.interceptors.response.use(
            (response) => {
                return response.data
            },
            (err) => {
                if (err && err.response) {
                    switch (err.response.status) {
                        case 400:
                            err.message = '请求错误'
                            break

                        default:
                            break
                    }
                }

                if (err.message) {
                    ElMessage({
                        message: '请求超时',
                        type: 'error',
                        showClose: true
                    })
                }
                return Promise.reject(err)
            }
        )

        // 请求处理
        instance(options)
            .then(res => {
                // mock 数据，所以接口返回的数据格式由我们自己定义
                /**
                 * response 统一格式
                 * {
                 *    code: 200,
                 *    msg: '消息[String]',
                 *    data: '返回数据[any]'
                 * }
                 * 
                 * code说明
                 * 200 成功
                 * -1 失败，可能网络不通，或者后台服务器异常等等
                 * -2 登录失效，跳回登录。登录的时间过长，导致后端数据超时，不认可当前的登录态，需要重新登录
                 */
                // 请求成功
                if (res.code === 200) {
                    resolve(res)
                } else {
                    // 登录态失效
                    if (res.code === -2) {
                        router.push('/login')
                    } else {
                        ElMessage({
                            message: res.msg || '操作失败',
                            type: 'error',
                            showClose: true
                        })
                    }
                    // 接口请求失败回调
                    reject(res)
                }
            }).catch((err) => {
                reject(err)
            })
    })
}
